#include <iostream>
#include "./dynamic_lib_src/sub.h"
#include "./dynamic_lib_src/sum.h"

using namespace std;

//这里我们也是以我们自己的文件生成动态库为例
//把dynamic里面.cc文件统统编译成为.o文件
//然后将.o文件用如下的命令生成动态库
//g++ -fPIC -shared sum.o sub.o -o libmymath.so 
//其中-fPIC表示产生位置无关码
//-shared表示生成共享库的格式

//上面生成了动态库,那么下面这里我们使用动态库
//使用以下的命令来把动态库和test.o文件
//g++ test.cc -I./dynamic_lib_output -L./dynamic_lib_output -lmymath
//我来解释一下,其中各个参数的效果
//-I代表指明头文件的搜索路径
//-L代表库文件搜索路径
//-l代表指明链接哪一个库
//如上的条件只是告诉了编译器,编译的时候头文件和库路径在哪里,当程序编译好的时候,此时已经和编译无关了
//当程序运行的时候,需要动态加载动态库,那么这个时候就需要加载器去进行动态加载
//那么我们需要告诉加载器动态库的位置,所以我们有3种解决办法
//1.将我们的动态库,放入系统默认的路径下,/lib64 
//2.通过以下的代码进行导入动态库路径的环境变量
//export LD_LIBRARY_PATH=$/home/qingdiaoshen/Linux/basic_io/dynamic_libraries_and_static_libraries/dynamic_libraries/dynamic_lib_output 
//注意:只对当前shell有效,关闭shell或者退出当前用户,则环境变量配置就无效了
//3.进入/etc/ld.so.conf.d,添加自己的文件,这里面的文件就是动态库的路径
//创建的文件名如下xxx.conf
//xxx.conf往里面写入动态库的路径
//然后保存退出后,执行命令sudo ldconfig刷新当前缓存
//当你删除这个文件之后,也需要执行sudo ldconfig来刷新缓存
//ldconfig -p命令可以查看每个动态库的路径

int main()
{
    int a = 100;
    int b = 200;
    cout << sum(b, a) << endl;
    cout << sub(b, a) << endl;
    return 0;
}

//如果只提供了静态库,我们只能将我们的库,静态链接到我们的程序中

//如果只提供了动态库,我们只能将我们的库,采用动态链接
//此时加上了-static的选项是要报错的,代表只能静态链接

//如果有两种库,那么是可以动态链接和静态链接一起的,
//但是gcc会优先链接动态库,这和时候可以不加-static
//可以静态和动态一起用,加了-static就代表只能静态连链接了

//为什么我们默认会安装动态库?
//因为我们的很多命令是c语言写的,而且是动态链接的
